﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once

#include "ICurve2d.h"
#include "Coordinate2d.h"


namespace gcmp
{
    /// \brief 螺旋线
    ///
    class ISpiralLine2d : public ICurve2d
    {
        DEFINE_CAST_DERIVED(gcmp::ISpiralLine2d, gcmp::ICurve2d);
    public:        

        /// \brief 根据中心点、半径、参数范围、顺逆方向、半径系数构建螺线对象
        /// \param coord             螺旋线坐标系，起点位于XY平面
        /// \param dRadius           螺旋线起始半径，必须大于0
        /// \param rRange            螺线的参数范围（Radius*旋转角度）
        ///                          Min: Radius * 起始角度，Max : Radius * 终止角度，须满足螺旋线上每一点的半径值 >= 0.0
        /// \param dRadiusCoef       螺旋线系数，含义为螺线的半径差/rRange.Length()
        ///                          dRadiusCoef = (终止半径 - 起始半径) / （Radius*旋转总角度）；
        ///                          当dRadiusCoef = 0时，螺线为常半径, 退化为圆弧(须满足 Range.Max - Range.Min <= Radius * M_2PI)；
        ///                          当dRadiusCoef != 0时，螺线为变半径
        /// \param antiClockwise     顺逆方向，true：逆时， false：顺时 
        /// \return  螺旋线 
        GCMP_GEOMETRY_INTERFACE_EXPORT static OwnerPtr<ISpiralLine2d> Create(
            const Coordinate2d& coord, 
            double dRadius,
            const Intervald& rRange,
            double dRadiusCoef,
            bool antiClockwise = true );

    public:
        /// \brief  获取坐标系
        /// \return 成功返回坐标系对象
        virtual Coordinate2d GetCoordinate() const = 0;

        /// \brief  设置坐标系
        /// \param coord  坐标系对象
        /// \return void
        virtual void SetCoordinate(const Coordinate2d& coord) = 0;

        /// \brief  获取螺旋线的半径
        /// \return 半径
        virtual double GetRadius() const = 0;

        /// \brief  设置螺旋线的半径
        /// \param radius  半径值
        /// \return void
        virtual void SetRadius(double radius) = 0;

        /// \brief  获取螺旋线的旋转角度范围
        /// \return 范围对象
        virtual Intervald GetRange() const = 0;

        /// \brief  设置螺旋线的参数范围
        /// \param range 范围对象
        /// \return void
        virtual void SetRange(const Intervald& range) = 0;

        /// \brief 获取顺时针或逆时针方向，true：逆时， false：顺时
        /// \return  时针方向
        virtual bool IsAntiClockwise() const = 0;

        /// \brief  设置螺旋线顺逆方向
        /// \param clockSign  1：逆时， -1：顺时
        /// \return void
        virtual void SetAntiClockwise(bool antiClockwise) = 0;         

        /// \brief  获取螺旋线的半径系数 
        /// \return 含义为螺旋线的半径差/range.Length(),0代表常半径
        virtual double GetRadiusCoefficient() const = 0;

        /// \brief  设置螺旋线的半径系数 
        /// \param radiusCoef  含义为螺旋线的半径差/range.Length(),0代表常半径
        /// \return void
        virtual void SetRadiusCoefficient(double radiusCoef) = 0;
    };
}

